/*
  字典序最小的 BFS 序
  题目描述
    给你一棵有根树，你现在需要构造出这棵树字典序最小的 BFS 序。
  输入格式
    第一行为一个数 n，表示树的节点个数。1 ≤ n ≤ 10^5。
    第二行为 n 个数，第 i 个数表示第 i 个点的父亲。若没有父亲用 0 表示。
    保证输入真的能形成一棵树。
  输出格式
    一行 n 个整数，表示这棵树字典序最小的 BFS 序。
  输入数据 1
    8
    0 1 1 1 3 2 4 2
  输出数据 1
    1 2 3 4 6 8 5 7
*/


#include <bits/stdc++.h>

using namespace std;

vector <int> son[100005];  // 用儿子表示法来表示树. son[i] 表示第 i 个 (i > 0) 节点的子节点组成的动态数组
int gen;   // 根节点的编号
int n;     // 树的节点个数
queue <int> q;  // 广度优先搜索(BFS) 算法使用的 queue.

// 用广度优先搜索法访问节点 to 代表的树(子树)，并将每个节点的值打印出来
// BFS 是 Breadth First Search 的缩写!
// 注意: 通常 BFS 需要用到 queue!
//       请对比一下 "广度优先搜索法 (BFS)" 和 "深度优先搜索法 (DFS)" 代码实现上的差异!
void BFS(int x) {
    q.push(x);
    while (!q.empty()) {
        int num = q.front();
        cout << num << " ";
        q.pop();
        for (int i = 0; i < son[num].size(); i++) {
            int a = son[num][i];
            q.push(a);
        }
    }
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> x;
        if (x == 0) {
            gen = i;  // 根节点. 提示: 根节点不一定是第 1 个节点， 也可以是第 i 个点(i > 1)
        } else {
            son[x].push_back(i); // 由于我们是按照从小到大的顺序往子节点vector数组中push值,
                                 // 因此只要按从下标 0 开始往后访问的顺序从vector数组中取值(参见 BFS 函数)，
                                 // 就能保证是字典序最小!
        }
    }
    BFS(gen);

    return 0;
}